package cn.zhouchao.system.aop;

import cn.zhouchao.system.ann.AnnSysR;
import cn.zhouchao.system.domain.SystemRecord;
import cn.zhouchao.system.mapper.SystemRecordMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.omg.Messaging.SyncScopeHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.Date;

@Component
@Aspect
@Slf4j
public class AopSysR {
    @Autowired
    private SystemRecordMapper systemRecordMapper;
    @Around("@annotation(cn.zhouchao.system.ann.AnnSysR)")
    public Object AopSystemRecord(ProceedingJoinPoint pjp) throws Throwable {

        //1.每次创建一个新的【访问时间】
        Date visitTime = new Date();
        log.info("访问时间：{}",visitTime);

        //2.获取访问方法名
        //2.1.利用注解编辑具体的【描述】和【方法名】
        //2.2.获取到注解上的方法名
        MethodSignature signature = (MethodSignature) pjp.getSignature();//强转
        Method method = signature.getMethod();
        //2.3获取注解指定的加注解类
        AnnSysR annSysR = method.getAnnotation(AnnSysR.class);
        String weyname = annSysR.weyname();//方法名
        log.info("方法名：{}",weyname);
        String des = annSysR.des();//描述
        log.info("方法描述：{}",des);

        //3.获取访问Ip
        InetAddress localHost = Inet4Address.getLocalHost();
        String ip = localHost.getHostAddress();
        log.info("电脑ip地址：{}",ip);

        //4.创建一个记录对象
        SystemRecord systemRecord = new SystemRecord();
        //4.1将对应的数据设置进去
        systemRecord.setVisitTime(visitTime);
        systemRecord.setVisitwayName(weyname);
        systemRecord.setVisitIp(ip);

        //5.调用接口对数据库执行添加方法
        systemRecordMapper.add(systemRecord);//新增对象

        //6.执行操作方法
        Object proceed = pjp.proceed();

        //7.返回操作结果
        return proceed;
    }
}
